package org.com.blbl.hotTopic;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/*
1.类名: HotTopicReducer
2.继承: 该类继承自 Reducer，这是 Hadoop MapReduce 框架中的一个核心类。
3.类型参数:
第一个 Text 表示输入的键类型（在这里是主题的名称）。
第二个 Text 表示输入的值类型（在这里是小分区及其计数，格式为 subPartition,count）。
第三个 Text 表示输出的键类型（同样是主题的名称）。
第四个 Text 表示输出的值类型（热门小分区及其计数）。
 */
public class HotTopicReducer extends Reducer<Text, Text, Text, Text> {

    @Override
    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        // 创建一个 HashMap 以存储每个小分区及其对应的计数。
        Map<String, Integer> subPartitionCount = new HashMap<>();
        //使用增强的 for 循环遍历 values 中的每个 Text 值。
        for (Text value : values) {
            //将每个 Text 值转换为字符串，并使用逗号分割成两个部分：小分区名称和计数。
            String[] parts = value.toString().split(",");
            //subPartition 是小分区的名称，count 是该小分区的计数（通过 Integer.parseInt 转换为整数）
            String subPartition = parts[0];
            int count = Integer.parseInt(parts[1]);
            // 使用 put 方法将小分区及其计数存入 subPartitionCount 中，如果小分区已经存在，则累加其计数。
            subPartitionCount.put(subPartition, subPartitionCount.getOrDefault(subPartition, 0) + count);
        }

        // 找到数量最多的小分区
        //popularSubPartition 用于存储数量最多的小分区，maxCount 用于存储该小分区的计数。
        String popularSubPartition = null;
        int maxCount = 0;
        //使用 entrySet() 方法遍历 subPartitionCount 中的每个条目。
        for (Map.Entry<String, Integer> entry : subPartitionCount.entrySet()) {
            //如果当前小分区的计数大于 maxCount，则更新 maxCount 和 popularSubPartitio
            if (entry.getValue() > maxCount) {
                maxCount = entry.getValue();
                popularSubPartition = entry.getKey();
            }
        }
        //使用 context.write 方法将主题名称（key）和其热门小分区及计数（格式为 热门小分区\t数量）作为输出。
        context.write(key, new Text(popularSubPartition + "\t" + maxCount)); // 输出分区、热门小分区及数量
    }

}
